package com.zenithmind.library.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.library.pojo.domain.BookCopy;
import com.zenithmind.library.pojo.vo.BookDetailVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 图书副本Mapper接口
 * 
 * @author ZenithMind
 * @since 2024-06-14
 */
@Mapper
public interface BookCopyMapper extends BaseMapper<BookCopy> {

    /**
     * 根据图书ID查询副本列表
     * 
     * @param bookId 图书ID
     * @return 副本列表
     */
    List<BookDetailVO.BookCopyVO> selectBookCopiesByBookId(@Param("bookId") String bookId);

    /**
     * 根据条形码查询副本
     * 
     * @param barcode 条形码
     * @return 图书副本
     */
    BookCopy selectByBarcode(@Param("barcode") String barcode);

    /**
     * 根据RFID标签查询副本
     * 
     * @param rfidTag RFID标签
     * @return 图书副本
     */
    BookCopy selectByRfidTag(@Param("rfidTag") String rfidTag);

    /**
     * 查询可借阅的副本
     * 
     * @param bookId 图书ID
     * @return 可借阅副本列表
     */
    List<BookCopy> selectAvailableCopies(@Param("bookId") String bookId);

    /**
     * 统计图书副本数量
     * 
     * @param bookId 图书ID
     * @param status 状态
     * @return 副本数量
     */
    int countBookCopies(@Param("bookId") String bookId, @Param("status") Integer status);

    /**
     * 批量更新副本状态
     * 
     * @param ids 副本ID列表
     * @param status 状态
     * @return 更新行数
     */
    int batchUpdateStatus(@Param("ids") List<String> ids, @Param("status") Integer status);

    /**
     * 更新副本位置信息
     * 
     * @param id 副本ID
     * @param location 位置信息
     * @param shelfNumber 书架号
     * @param floorNumber 层号
     * @param area 区域
     * @return 更新行数
     */
    int updateLocation(@Param("id") String id, 
                      @Param("location") String location,
                      @Param("shelfNumber") String shelfNumber,
                      @Param("floorNumber") Integer floorNumber,
                      @Param("area") String area);

    /**
     * 分页查询副本信息
     * 
     * @param page 分页参数
     * @param bookId 图书ID
     * @param status 状态
     * @param location 位置
     * @return 分页结果
     */
    IPage<BookDetailVO.BookCopyVO> selectBookCopyPage(Page<BookDetailVO.BookCopyVO> page,
                                                     @Param("bookId") String bookId,
                                                     @Param("status") Integer status,
                                                     @Param("location") String location);
}
